一、增删改查

定义接口

1
2
3
4
5
6
7
8
9
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
public void addEmp(Employee employee);
public void updateEmp(Employee employee);
public void deleteEmpById(Integer id);
}

定义SQL映射文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--
parameterType:可以省略
-->
<insert id="addEmp" parameterType="com.glemontree.mybatis.bean.Employee">
insert into tbl_employee(last_name, email, gender)
values(
#{lastName},
#{email},
#{gender}
)
</insert>
<update id="updateEmp">
update tbl_employee
set last_name = #{lastName}, email = #{email}, gender = #{gender}
where id = #{id}
</update>
<delete id="deleteEmpById">
delete from tbl_employee
where id = #{id}
</delete>

使用#{}的方式从传入的Employee对象中取属性!

定义测试文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Test
public void test03() throws IOException {
// 获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
// 根据SqlSessionFactory获取SqlSession对象
// openSession()方法不会自动提交,需要自己手动提交
// openSession(true)方法会进行自动提交
SqlSession openSession = sqlSessionFactory.openSession();
// 获取接口的实现类对象
// MyBatis会为接口自动的创建一个代理对象,代理对象去执行增删改查
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
// 测试添加
/*Employee employee = new Employee(null, "jery", "jerry@gmail.com", "1");
mapper.addEmp(employee);*/
// 测试修改
/*Employee employee = new Employee(1, "jerry", "jerry@gmail.com", "0");
mapper.updateEmp(employee);*/
// 测试删除
mapper.deleteEmpById(2);
// 手动提交数据
openSession.commit();
} finally {
openSession.close();
}
}

这里需要的是SqlSessionFactory的openSession()方法有两种形式,第一种是不带参数,此时在执行增删改的时候需要手动提交数据,也即上面代码的

1
openSession.commit();

第二种是带参数,该参数的含义是是否自动提交数据,如果设置为true,那么在执行增删改的时候不需要自己再去执行上面这行代码。

另外,MyBatis允许增删改直接定义以下类型的返回值:Integer、Long、Boolean。如果返回值为Boolean,此时在执行增删改的时候如果影响了0行以上,就会返回true,否则返回false。如果返回值为Integer或者Long,那么返回的就是影响了数据库中多少行的数据。

二、insert获取自增主键的值

原生的JDBC是支持获取自增主键的值的,使用statement.getGeneratedKeys()方法,MyBatis也支持自增主键,自增主键的获取也是利用statement.getGeneratedKeys()方法,我们需要设置<insert>标签的useGeneratedKeys="true"属性,表示使用自增主键值获取主键值策略,同时设置<insert>标签的keyProperty属性指定对应的主键属性,也就是MyBatis获取到主键值以后将主键值封装给JavaBean的哪个属性,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--
parameterType:可以省略
MySQL支持自增主键,自增主键的获取,MyBatis也是利用Statement.getGeneratedKeys()方法
useGeneratedKeys="true":使用自增主键值获取主键值策略
keyProperty="":指定对应的主键属性,也就是MyBatis获取到主键值以后将主键值封装给JavaBean的哪个属性
-->
<insert id="addEmp" parameterType="com.glemontree.mybatis.bean.Employee"
useGeneratedKeys="true" keyProperty="id">
insert into tbl_employee(last_name, email, gender)
values(
#{lastName},
#{email},
#{gender}
)
</insert>

三、insert Oracle使用序列生成主键

Oracle不支持自增,但是Oracle使用序列来模拟自增,每次插入的数据的主键是从序列中取出的值。在Oracle中可以使用下面的语句查看当前用户的序列,last_number表示当前值。

1
select * from user_sequences;

因此Oracle在插入数据时首先从序列中查出下一个将要使用的序列的值:

1
select EMPLOYEE_SEQ.nextval from dual;

然后再执行插入操作:

1
insert into employees(EMPLOYEE_ID, LAST_NAME, EMAIL) values(xxx, 'admin', 'admin@gmail.com'); // xxx表示上一步中使用sql语句获取到的序列中的值

这样在映射文件中可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
<insert id="addEmp" databaseId="oracle">
<!--
keyProperty表示将查出的主键值封装给JavaBean的哪个属性
order="BEFORE":当前SQL在插入SQL之前执行
resultType="":查出的数据的类型
-->
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
<!-- 编写查询主键的sql语句 -->
select EMPLOYEE_SEQ.nextval from dual;
</selectKey>
<!-- 插入时的主键是从序列中拿到的 -->
insert into employees(EMPLOYEE_ID, LAST_NAME, EMAIL) values(#{id}, #{lastName}, #{email});
</insert>

在上面的这段代码中需要注意,使用<selectKey>标签在插入语句执行之前获取主键值,其keyProperty属性表示将查出的主键值封装给JavaBean的哪个属性,order属性表示当前SQL语句在插入SQL语句之前执行,而resultType属性则表示查出的数据的类型。